home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
rjs.lha
/
RJS
/
Transport
/
src
/
InetAddress.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-14
|
3KB
|
112 lines
#include <stdio.h>
#include <osfcn.h>
#include <libc.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <iostream.h>
#include "Transport.h"
extern "C" {
unsigned long htonl(unsigned long);
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
struct hostent *gethostbyname(const char *host);
}
char *RJS_InetAddress::Any="0.0.0.0";
char *RJS_InetAddress::Broadcast="255.255.255.255";
const RJS_Status RJS_InetAddress::UnKnownService("unknown service");
ostream &operator<<(ostream &os, const RJS_InetAddress &ia)
{
if (!ia.ss_ok()) os <<"(" << ia.ss_message() << ")";
else os << "(" << ia.hostname() << "," << ia.port() << ")";
return os;
}
RJS_InetAddress::RJS_InetAddress()
{
ss_set(NoHostGiven); // no address looked up
addrlen=sizeof(address);
}
RJS_InetAddress::RJS_InetAddress(int port)
{
lookup(Any,port);
}
RJS_InetAddress::RJS_InetAddress(const char *hostname, int port)
{
lookup(hostname,port);
}
RJS_InetAddress::RJS_InetAddress(const char *hostname,
const char *service,
const char *proto)
{
lookup(hostname,service,proto);
}
RJS_InetAddress::RJS_InetAddress(const char *service,
const char *proto)
{
lookup(Any,service,proto);
}
int RJS_InetAddress::lookup(const char *hostname, int port)
{
ss_set(HostFound);
addrlen=sizeof(address);
bzero((char *) &address , addrlen);
address.sin_family = RJS_Socket::AfInet;
address.sin_port = htons(port);
if (hostname==Any) address.sin_addr.s_addr = htonl(INADDR_ANY);
else if (hostname==Broadcast) address.sin_addr.s_addr = htonl(INADDR_BROADCAST);
else if ((address.sin_addr.s_addr =inet_addr(hostname))==-1) {
struct hostent *hp=gethostbyname(hostname);
if (hp==NULL) ss_set(UnknownHost);
else bcopy(hp->h_addr,(char*)&address.sin_addr,hp->h_length);
}
any_flag =
(address.sin_addr.s_addr==htonl(INADDR_ANY)) ? 1 : 0;
broadcast_flag =
(address.sin_addr.s_addr==htonl(INADDR_BROADCAST)) ? 1 : 0;
return ss_ok();
}
int RJS_InetAddress::lookup(const char *hostname,
const char *service,
const char *proto)
{
struct servent *se=getservbyname(service,proto);
if (se==NULL) {
ss_set(UnKnownService);
return 0;
}
return lookup(hostname,ntohs(se->s_port));
}
const char *RJS_InetAddress::hostname() const
{
struct hostent *hp;
hp=gethostbyaddr((char *)&address.sin_addr,addrlen,RJS_Socket::AfInet);
if (hp==NULL) return inet_ntoa( address.sin_addr);
else return hp->h_name;
}
const char *RJS_InetAddress::numeric_hostname() const
{
return inet_ntoa( address.sin_addr);
}
int RJS_InetAddress::port() const
{
return ntohs(address.sin_port);
}